iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Cloud Native

The Journey of ASP.NET and Beyond系列 第 10

ASP.NET Core Web API: Dispatching a Missive

  • 分享至 

  • xImage
  •  

In the heart of the city, the Adventurer Guild sends missives, sealed with their emblem.

  人與人之攀談,乃訊息、情報流通之一環,今若二者間有千里之遙,則何以交談?有鑒於此,信札便由此誕生,信札乃成人所欲言之語,其言寫於札上,並委以信使傳遞,而信使則成二者間攀談之途徑,久而久之,交通發達,處處設立郵驛,遞信已成日常事。而公會因事務所需,以書信聯繫冒險者早已習以為常,其目的不外乎委託任務、派發報酬、告知要事等等,由此可想公會郵遞系統必根深蒂固。

遞信 Send Email


  公會之郵遞系統以MailKit完成,若要使用必須至「管理NuGet套件」處進行下載。下一步便是建立郵遞之資訊設定,至appsettings.json處進行建立,需建之設定如下:

  "MailSettings": {
    "Server": "SMTP之地址",
    "Port": 465, // 連接阜
    "SenderName": "寄件人之名",
    "SenderEmail": "寄件人之郵箱地址",
    "UserName": "寄件人之帳號",
    "Password": "寄件之第三方通行碼"
  }

  再建一DTO,以便運貨人紀錄郵遞之資訊。

    public class MailConfig
    {
        public string Server { get; set; }
        public int Port { get; set; }
        public string SenderName { get; set; }
        public string SenderEmail { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
    }

  新增var mailConfig=builder.Configuration.GetSection("MailSettings").Get<MailConfig>();於program.cs處,用來使運貨人實際紀錄郵遞之資訊,完成後,還需再進行MailConfig之註冊。

var mailConfig = builder.Configuration.GetSection("MailSettings").Get<MailConfig>();
if (mailConfig != null)
{
    builder.Services.AddSingleton(mailConfig);
}

  萬事俱備,便可進行撰寫信札及寄信之事項,首先依舊是於DTO中創立寄信之格式

    public class MailData
  {
      public string Name { get; set; } // 收件人之名
      public string Dwelling { get; set; } // 收件人郵箱地址
      public string Subject { get; set; } // 標題
      public string Body { get; set; } // 內文
  }

  其次於Helper中建立MailHelper.cs,進行信札及寄信之各種事務之郵遞部門。首先為信札之創立:

public class MailHelper
{
  // 依賴注入郵遞之資訊
  private readonly MailConfig _mailConfig;
  public MailHelper(MailConfig mailConfig)
  {
      _mailConfig = mailConfig;
  }
  // 書寫及寄信之流程
  public void SendMail(MailData mailData)
  {
      var mail = CreateEmailMessage(mailData);
      Send(mail);
  }

  // 書寫信札之處
  private MimeMessage CreateEmailMessage(MailData mailData)
  {
      var message = new MimeMessage();
      // From處,此處應填寄件人之資訊
      message.From.Add(new MailboxAddress(_mailConfig.SenderName, _mailConfig.SenderEmail));
      // To處,此處應填收件人之資訊
      message.To.Add(new MailboxAddress(mailData.Name, mailData.Dwelling));
      // Subject處,此處應填信件之標題
      message.Subject = mailData.Subject;
      // 內文之構築
      var bodyBuilder = new BodyBuilder();
      bodyBuilder.TextBody = mailData.Body;
      // Body處,此處應填信件之內文
      message.Body = bodyBuilder.ToMessageBody();

      return message;
  }
  
  // 傳遞信札之處
  private void Send(MimeMessage message)
  {
      using(var client = new SmtpClient())
      {
          try
          {
              // 連接至smtp伺服器
              client.Connect(_mailConfig.Server, _mailConfig.Port, true);
              // 寄件人之認證
              client.Authenticate(_mailConfig.UserName, _mailConfig.Password);
              // 寄信
              client.Send(message);
          }
          catch
          {
              throw;
          }
          finally
          {
              client.Disconnect(true);
          }
          
      }

  }
}

  完成後謹記需於program.cs中進行builder.Services.AddSingleton<MailHelper>();之註冊,方能使用遞信之事務。接著禮賓部便可將欲寫之信整理,並交由郵遞部門處理。

    [ApiController]
    [Route("[controller]")]
    public class MailController : ControllerBase
    {
        private readonly MailHelper _mailHelper;
        public MailController(MailHelper mailHelper)
        {
            _mailHelper = mailHelper;
        }

        [HttpPost]
        public async Task<IActionResult> Index(MailData mailData)
        {
            _mailHelper.SendMail(mailData);

            return Ok(mailData);
        }
    }

成功後便可於信箱中收到信札。


上一篇
ASP.NET Core Web API: Identity Recognition
下一篇
ASP.NET Core Web API: Sorcery of AutoMapper
系列文
The Journey of ASP.NET and Beyond30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言